
import axios from 'axios';
import { ElMessage } from 'element-plus';
import { get, merge } from 'lodash-es';



/** 创建请求实例 */
function createService() {
  // 创建一个 axios 实例命名为 service
  const service = axios.create();
  // 请求拦截
  service.interceptors.request.use(
    (config) => config,
    // 发送失败
    (error) => Promise.reject(error)
  );
  // 响应拦截（可根据具体业务作出相应的调整）
  service.interceptors.response.use(
    (response) => {
      
      // apiData 是 api 返回的数据
      const apiData = response.status;
      console.log("33",response);
      
      if(!response.data.success){
        return Promise.reject(response);
      }
      // 二进制数据则直接返回
      const responseType = response.request?.responseType;
      if (responseType === 'blob' || responseType === 'arraybuffer') return response;

      if (response.headers?.dev_id) return response;

      if (apiData === undefined) {
        ElMessage.error('非本系统的接口');
        return Promise.reject(new Error('非本系统的接口'));
      }
      switch (apiData) {
        case 200:
         
          
          return response.data;
       
        default:
          // 不是正确的 code
          ElMessage.error('Error');
          return Promise.reject(new Error('Error'));
      }
    },
    (error) => {
      // status 是 HTTP 状态码
      const status = get(error, 'response.status');
      switch (status) {
        case 400:
          error.message = '请求错误';
          break;
       
        case 403:
          error.message = '拒绝访问';
          break;
        case 404:
          error.message = '请求地址出错';
          break;
        case 500:
          error.message = '服务器内部错误';
          break;
        default:
          break;
      }
      // ElMessage.error(error.message);
      return Promise.reject(error);
    }
  );
  return service;
}

/** 创建请求方法 */
function createRequest(service) {
  return function (config) {
    
    const defaultConfig = {
      headers: {
        'Content-Type': 'application/json'
      },
      timeout: 50000,
      baseURL: '/api',
      data: {}
    };
    // 将默认配置 defaultConfig 和传入的自定义配置 config 进行合并成为 mergeConfig
    const mergeConfig = merge(defaultConfig, config);
    return service(mergeConfig);
  };
}

/** 用于网络请求的实例 */
const service = createService();
/** 用于网络请求的方法 */
export const request = createRequest(service);


export async function DownloadFile(url, params = {}, customFilename = '') {
  try {
    const response = await axios({
      method: 'post',
      url,
      data: params,
      responseType: 'blob', // 关键参数
      headers: {
        'Content-Type': 'multipart/form-data'
      }
    });

    // 从响应头获取文件名或使用自定义名
    const contentDisposition = response.headers['content-disposition'];
    let filename = customFilename;
    if (contentDisposition) {
      const filenameMatch = contentDisposition.match(/filename=(.*)/);
      if (filenameMatch && filenameMatch[1]) {
        filename = decodeURIComponent(filenameMatch[1]);
      }
    }

    // 创建Blob对象
    const blob = new Blob([response.data], { 
      type: response.headers['content-type'] 
    });
    const downloadUrl = window.URL.createObjectURL(blob);
    
    // 创建临时链接触发下载
    const link = document.createElement('a');
    link.href = downloadUrl;
    link.download = filename || 'download.zip';
    document.body.appendChild(link);
    link.click();
    
    // 清理资源
    document.body.removeChild(link);
    window.URL.revokeObjectURL(downloadUrl);
  } catch (error) {
    console.error('下载失败:', error);
    throw error;
  }
}
